<extend name="Base/common"/>
<block name="header"></block>
<block name="body">
  <script src="__STATIC__/lib/core.js"></script>
  <script src="__STATIC__/lib/md5.js"></script>
  <script src="__STATIC__/lib/sha1.js"></script>
  <script Language="javascript">
    function getSignType(){
      return "SHA1";
    }
    
    function getTimeStamp(){
      var timestamp=new Date().getTime();
      var timestampstring = timestamp.toString();//一定要转换字符串
      oldTimeStamp = timestampstring;
      return timestampstring;
    }

    function getNonceStr(){
      var $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
      var maxPos = $chars.length;
      var noceStr = "";
      for (i = 0; i < 32; i++) {
        noceStr += $chars.charAt(Math.floor(Math.random() * maxPos));
      }
      oldNonceStr = noceStr;
      return noceStr;
    }

    //以下是package组包过程：
    var oldPackageString;//记住package，方便最后进行整体签名时取用

    function getPackage(){
      var banktype = "WX";
      var body = "{$data['body']}";//商品名称信息，这里由测试网页填入。
      var fee_type = "1";//费用类型，这里1为默认的人民币
      var input_charset = "UTF-8";//字符集，这里将统一使用UTF-8
      var notify_url = "{$data['notify_url']}";//支付成功后将通知该地址
      var out_trade_no = "{$data['out_trade_no']}";//订单号，商户需要保证该字段对于本商户的唯一性
      var partner = "{$data['partnerid']}";//测试商户号
      var spbill_create_ip = "{$data['spbill_create_ip']}";//用户浏览器的ip，这个需要在前端获取。这里使用127.0.0.1测试值
      var total_fee = "{$data['total_fee']}";//总金额。
      var partnerKey = "{$data['partnerKey']}";//这个值和以上其他值不一样是：签名需要它，而最后组成的传输字符串不能含有它。这个key是需要商户好好保存的。
      
      //首先第一步：对原串进行签名，注意这里不要对任何字段进行编码。这里是将参数按照key=value进行字典排序后组成下面的字符串,在这个字符串最后拼接上key=XXXX。由于这里的字段固定，因此只需要按照这个顺序进行排序即可。
      var signString = "bank_type="+banktype+"&body="+body+"&fee_type="+fee_type+"&input_charset="+input_charset+"&notify_url="+notify_url+"&out_trade_no="+out_trade_no+"&partner="+partner+"&spbill_create_ip="+spbill_create_ip+"&total_fee="+total_fee+"&key="+partnerKey;
      
      var md5SignValue =  ("" + CryptoJS.MD5(signString)).toUpperCase();
      //然后第二步，对每个参数进行url转码，如果您的程序是用js，那么需要使用encodeURIComponent函数进行编码。
        
      banktype = encodeURIComponent(banktype);
      body=encodeURIComponent(body);
      fee_type=encodeURIComponent(fee_type);
      input_charset = encodeURIComponent(input_charset);
      notify_url = encodeURIComponent(notify_url);
      out_trade_no = encodeURIComponent(out_trade_no);
      partner = encodeURIComponent(partner);
      spbill_create_ip = encodeURIComponent(spbill_create_ip);
      total_fee = encodeURIComponent(total_fee);
      
      //然后进行最后一步，这里按照key＝value除了sign外进行字典序排序后组成下列的字符串,最后再串接sign=value
      var completeString = "bank_type="+banktype+"&body="+body+"&fee_type="+fee_type+"&input_charset="+input_charset+"&notify_url="+notify_url+"&out_trade_no="+out_trade_no+"&partner="+partner+"&spbill_create_ip="+spbill_create_ip+"&total_fee="+total_fee;
      completeString = completeString + "&sign="+md5SignValue;
      oldPackageString = completeString;//记住package，方便最后进行整体签名时取用
      
      return completeString;
    }
    
    
    //下面是app进行签名的操作：
    
    var oldTimeStamp ;//记住timestamp，避免签名时的timestamp与传入的timestamp时不一致
    var oldNonceStr ; //记住nonceStr,避免签名时的nonceStr与传入的nonceStr不一致

    function getSign(){
      var app_id = "{$data['appId']}";
      var app_key = "{$data['paySignKey']}";
      var nonce_str = oldNonceStr;
      var package_string = oldPackageString;
      var time_stamp = oldTimeStamp;
      app_id.toString();
      app_key.toString();
      //第一步，对所有需要传入的参数加上appkey作一次key＝value字典序的排序
      var keyvaluestring = "appid="+app_id+"&appkey="+app_key+"&noncestr="+nonce_str+"&package="+package_string+"&timestamp="+time_stamp;
      sign = CryptoJS.SHA1(keyvaluestring).toString();
      return sign;
    }

    
    (function(){
      document.addEventListener('WeixinJSBridgeReady', function onBridgeReady(){
        var data = {
          "appId": "{$data['appId']}", //公众号名称，由商户传入
          "timeStamp": getTimeStamp(), //时间戳 这里随意使用了一个值
          "nonceStr": getNonceStr(), //随机串
          "package": getPackage(),
          //扩展字段，由商户传入
          "signType": getSignType(), //微信签名方式:sha1
          "paySign": getSign() //微信签名
        }

        WeixinJSBridge.invoke('getBrandWCPayRequest', data, function(res){
          // 返回 res.err_msg,取值
          // get_brand_wcpay_request:cancel 用户取消
          // get_brand_wcpay_request:fail 发送失败
          // get_brand_wcpay_request:ok 发送成功
          if(res.err_msg == "get_brand_wcpay_request:cancel"){
            window.history.back(-1);
          }else if(res.err_msg == "get_brand_wcpay_request:ok"){
            // 使用以上方式判断前端返回,微信团队郑重提示：res.err_msg将在用户支付成功后返回ok，但并不保证它绝对可靠。
            //因此微信团队建议，当收到ok返回时，向商户后台询问是否收到交易成功的通知，若收到通知，前端展示交易成功的界面；若此时未收到通知，商户后台主动调用查询订单接口，查询订单的当前状态，并反馈给前端展示相应的界面。
            // 查询订单状态哦
            var flowid = "{$data['out_trade_no']}";
            $.post(Think.U('Recharge/weixinOrderQuery'), 'flowid=' + flowid, function(res){
              if(res.errmsg == 'ok'){
                if(res.order_info.trade_state == 0){
                  Think.MUI.success('充值成功！');
                  window.location.href = "{$data['successUrl']}";
                }
              }else{
								Think.MUI.error('充值失败！');
							}
            }, 'json');
          }else if(res.err_msg == "get_brand_wcpay_request:fail"){
            window.history.back(-1);
          }
        });
      }, false);
    })();
  </script>
</block>
